package com.atguigu.juc.chap02;

import java.util.concurrent.locks.ReentrantLock;

/**
 * 抢票：线程操作资源类，高内聚低耦合
 * 1. 分析并创建出资源类：票
 * 2. 将资源属性和操作资源的方法内聚的定义在资源类中
 * 3. 在应用程序中创建资源类对象和线程对象
 * 4. 在线程中调用资源类的方法
 *
 * @author Taeyang
 * @date 2025/3/31
 */
public class SaleTicket {

    public static void main(String[] args) {
        // 创建资源类对象
        Ticket ticket = new Ticket();

        // 创建线程操作资源类A
        new Thread(() -> {
            // 线程操作资源类
            for (int i = 0; i < 10; i++) {
                ticket.sale();
            }
        }, "A").start();

        // 创建线程操作资源类B
        new Thread(() -> {
            // 线程操作资源类
            for (int i = 0; i < 10; i++) {
                ticket.sale();
            }
        }, "B").start();
    }
}

/**
 * 资源类：票
 */
class Ticket {

    /**
     * 可重入公平锁（true）
     */
    private final ReentrantLock lock = new ReentrantLock(true);

    /**
     * 余票数量
     */
    private Integer number = 10;

    /**
     * 卖票
     */
    public void sale() {

        lock.lock();
        if (number <= 0) {
            System.out.println(Thread.currentThread().getName() + "售票，售罄");
            lock.unlock();
            return;
        }
        try {
            Thread.sleep(200);
            System.out.println(Thread.currentThread().getName() + "售票，剩余票数：" + --number);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            lock.unlock();
        }

    }
}